// noinspection JSUnresolvedReference /** * Field Google Map */ /* global jQuery, document, redux_change, redux, google */ (function ( $ ) { 'use strict'; redux.field_objects = redux.field_objects || {}; redux.field_objects.google_maps = redux.field_objects.google_maps || {}; /* LIBRARY INIT */ redux.field_objects.google_maps.init = function ( selector ) { if ( ! selector ) { selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' ); } $( selector ).each( function ( i ) { let delayRender; const el = $( this ); let parent = el; if ( ! el.hasClass( 'redux-field-container' ) ) { parent = el.parents( '.redux-field-container:first' ); } if ( parent.is( ':hidden' ) ) { return; } if ( parent.hasClass( 'redux-field-init' ) ) { parent.removeClass( 'redux-field-init' ); } else { return; } // Check for delay render, which is useful for calling a map // render after JavaScript load. delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) ); // API Key button. redux.field_objects.google_maps.clickHandler( el ); // Init our maps. redux.field_objects.google_maps.initMap( el, i, delayRender ); } ); }; /* INIT MAP FUNCTION */ redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) { let delayed; let scrollWheel; let streetView; let mapType; let address; let defLat; let defLong; let defaultZoom; let mapOptions; let geocoder; let g_autoComplete; let g_LatLng; let g_map; let noLatLng = false; // Pull the map class. const mapClass = el.find( '.redux_framework_google_maps' ); const containerID = mapClass.attr( 'id' ); const autocomplete = containerID + '_autocomplete'; const canvas = containerID + '_map_canvas'; const canvasId = $( '#' + canvas ); const latitude = containerID + '_latitude'; const longitude = containerID + '_longitude'; // Add map index to data attr. // Why, say we want to use delay_render, // and want to init the map later on. // You'd need the index number in the // event of multiple map instances. // This allows one to retrieve it // later. $( mapClass ).attr( 'data-idx', idx ); if ( true === delayRender ) { return; } // Map has been rendered, no need to process again. if ( $( '#' + containerID ).hasClass( 'rendered' ) ) { return; } // If a map is set to delay render and has been initiated // from another scrip, add the 'render' class so rendering // does not occur. // It messes things up. delayed = Boolean( mapClass.data( 'delay-render' ) ); if ( true === delayed ) { mapClass.addClass( 'rendered' ); } // Create the autocomplete object, restricting the search // to geographical location types. g_autoComplete = await google.maps.importLibrary( 'places' ); g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} ); // Data bindings. scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) ); streetView = Boolean( mapClass.data( 'street-view' ) ); mapType = Boolean( mapClass.data( 'map-type' ) ); address = mapClass.data( 'address' ); address = decodeURIComponent( address ); address = address.trim(); // Set default Lat/lng. defLat = canvasId.data( 'default-lat' ); defLong = canvasId.data( 'default-long' ); defaultZoom = canvasId.data( 'default-zoom' ); // Eval whether to set maps based on lat/lng or address. if ( '' !== address ) { if ( '' === defLat || '' === defLong ) { noLatLng = true; } } else { noLatLng = false; } // Can't have empty values, or the map API will complain. // Set default for the middle of the United States. defLat = defLat ? defLat : 39.11676722061108; defLong = defLong ? defLong : -100.47761000000003; if ( noLatLng ) { // If displaying a map based on an address. geocoder = new google.maps.Geocoder(); // Set up Geocode and pass address. geocoder.geocode( {'address': address}, function ( results, status ) { let latitude; let longitude; // Function results. if ( status === google.maps.GeocoderStatus.OK ) { // A good address was passed. g_LatLng = results[0].geometry.location; // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); // Get and set lat/long data. latitude = el.find( '#' + containerID + '_latitude' ); latitude.val( results[0].geometry.location.lat() ); longitude = el.find( '#' + containerID + '_longitude' ); longitude.val( results[0].geometry.location.lng() ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } else { // No data found, alert the user. alert( 'Geocode was not successful for the following reason: ' + status ); } } ); } else { // If displaying map based on an lat/lng. g_LatLng = new google.maps.LatLng( defLat, defLong ); // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, // Start off far unless an item is selected, set by php. streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create the map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } }; redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) { let markerTooltip; let infoWindow; let g_marker; let geoAlert = mapClass.data( 'geo-alert' ); // Get HTML. const input = document.getElementById( autocomplete ); // Set objects into the map. g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input ); // Bind objects to the map. g_autoComplete = new google.maps.places.Autocomplete( input ); g_autoComplete.bindTo( 'bounds', g_map ); // Get the marker tooltip data. markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Create infoWindow. infoWindow = new google.maps.InfoWindow(); // Create marker. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), draggable: true, title: markerTooltip, animation: google.maps.Animation.DROP } ); geoAlert = decodeURIComponent( geoAlert ); // Place change. google.maps.event.addListener( g_autoComplete, 'place_changed', function () { let place; let address; let markerTooltip; infoWindow.close(); // Get place data. place = g_autoComplete.getPlace(); // Display alert if something went wrong. if ( ! place.geometry ) { window.alert( geoAlert ); return; } console.log( place.geometry.viewport ); // If the place has a geometry, then present it on a map. if ( place.geometry.viewport ) { g_map.fitBounds( place.geometry.viewport ); } else { g_map.setCenter( place.geometry.location ); g_map.setZoom( 17 ); // Why 17? Because it looks good. } markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Set the marker icon. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), title: markerTooltip, clickable: true, draggable: true, animation: google.maps.Animation.DROP } ); // Set marker position and display. g_marker.setPosition( place.geometry.location ); g_marker.setVisible( true ); // Form array of address components. address = ''; if ( place.address_components ) { address = [( place.address_components[0] && place.address_components[0].short_name || '' ), ( place.address_components[1] && place.address_components[1].short_name || '' ), ( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' ); } // Set the default marker info window with address data. infoWindow.setContent( '
' + place.name + '
' + address ); infoWindow.open( g_map, g_marker ); // Run Geolocation. redux.field_objects.google_maps.geoLocate( g_autoComplete ); // Fill in address inputs. redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete ); } ); // Marker drag. google.maps.event.addListener( g_marker, 'drag', function ( event ) { document.getElementById( latitude ).value = event.latLng.lat(); document.getElementById( longitude ).value = event.latLng.lng(); } ); // End marker drag. google.maps.event.addListener( g_marker, 'dragend', function () { redux_change( el.find( '.redux_framework_google_maps' ) ); } ); // Zoom Changed. g_map.addListener( 'zoom_changed', function () { el.find( '.google_m_zoom_input' ).val( g_map.getZoom() ); } ); // Marker Info Window. infoWindow = new google.maps.InfoWindow(); google.maps.event.addListener( g_marker, 'click', function () { const marker_info = containerID + '_marker_info'; const infoValue = document.getElementById( marker_info ).value; if ( '' !== infoValue ) { infoWindow.setContent( infoValue ); infoWindow.open( g_map, g_marker ); } } ); }; /* FILL IN ADDRESS FUNCTION */ redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) { // Set variables. const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' ); // What if someone only wants city, or state, ect... // gotta do it this way to check for the address! // Need to check each of the returned components to see what is returned. const componentForm = { street_number: 'short_name', route: 'long_name', locality: 'long_name', administrative_area_level_1: 'short_name', country: 'long_name', postal_code: 'short_name' }; // Get the place details from the autocomplete object. const place = g_autoComplete.getPlace(); let component; let i; let addressType; let _d_addressType; let val; let len; document.getElementById( latitude ).value = place.geometry.location.lat(); document.getElementById( longitude ).value = place.geometry.location.lng(); for ( component in componentForm ) { if ( componentForm.hasOwnProperty( component ) ) { // Push in the dynamic form element ID again. component = containerID + '_' + component; // Assign to proper place. document.getElementById( component ).value = ''; document.getElementById( component ).disabled = false; } } // Get each component of the address from the place details // and fill the corresponding field on the form. len = place.address_components.length; for ( i = 0; i < len; i += 1 ) { addressType = place.address_components[i].types[0]; if ( componentForm[addressType] ) { // Push in the dynamic form element ID again. _d_addressType = containerID + '_' + addressType; // Get the original. val = place.address_components[i][componentForm[addressType]]; // Assign to proper place. document.getElementById( _d_addressType ).value = val; } } }; redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) { if ( navigator.geolocation ) { navigator.geolocation.getCurrentPosition( function ( position ) { const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude ); const circle = new google.maps.Circle( { center: geolocation, radius: position.coords.accuracy } ); g_autoComplete.setBounds( circle.getBounds() ); } ); } }; /* API BUTTON CLICK HANDLER */ redux.field_objects.google_maps.clickHandler = function ( el ) { // Find the API Key button and react on click. el.find( '.google_m_api_key_button' ).on( 'click', function () { // Find message wrapper. const wrapper = el.find( '.google_m_api_key_wrapper' ); if ( wrapper.is( ':visible' ) ) { // If the wrapper is visible, close it. wrapper.slideUp( 'fast', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } else { // If the wrapper is visible, open it. wrapper.slideDown( 'medium', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } } ); el.find( '.google_m_autocomplete' ).on( 'keypress', function ( e ) { if ( 13 === e.keyCode ) { e.preventDefault(); } } ); // Auto select autocomplete contents, // since Google doesn't do this inherently. el.find( '.google_m_autocomplete' ).on( 'click', function ( e ) { $( this ).trigger( 'focus' ); $( this ).trigger( 'select' ); e.preventDefault(); } ); }; } )( jQuery ); Excitewin: Kaikkein paras kasino pelattavana verkossa Suomessa – Orchid Group
Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Excitewin: Kaikkein paras kasino pelattavana verkossa Suomessa

Miksi Excitewin on Suomen parhaat nettikasinot?

Miksi Excitewin on Suomen parhaat nettikasinot? Excitewin tarjoaa suomalaisille kasino-ihminen mukavia bonus- tarjouksia ja laajan pelialueen. Pelialueelta löytyy useita eri pelikategorioita, kuten slottien, pöytäpelien ja live casinon peliä. Excitewin sivuston käyttö on helpointa, mikäli sinä et osaa englannin kieltä, koska se on käytettävissä myös suomeksi. Lisäksi Excitewin on saanut suositeltavan mainetta turvallisuudestaan ja asiakastukiestaan. Tämä tehdään helposti huomattavaksi siitä, että Excitewin on saanut Suomen parhaat nettikasinot -arvostelussa korkean arvosan. Nämä ovat vain yksi osa siitä, miksi Excitewin on yksi parhaista nettikasinoista Suomessa.

Excitewinin etujen tarkasteleminen

Ota Excitewin huomioon, kun etsit uusia nettikasinoita Suomeen! Tarkastele seuraavia etuja:
1. Suuri valinta peliin: Excitewin tarjoaa useita satoja peliä, joista voit valita mielitekoasi.
2. Hyvä bonukset: Excitewin tarjoaa uusille pelaajille suositeltavan bonukset.
3. Helppi käyttö: Excitewin on helposti käytettävissä ja sisältää selkeän ja käytännöllisen sivustonlayoutin.
4. Turvallisuus ja luotettavuus: Excitewin ottaa turvallisuus ja luotettavuus erittäin vakavasti, joten voit olla varma, että pelit on tehty turvallisesti.
5. Monipuoliset maksuvaihtoeet: Excitewin tarjoaa useita maksuvaihtoeita, joten voit valita mielitekoasi.
6. Tuki 24/7: Excitewin tarjoaa asiakkaalleen tukisupportin 24 tuntia päivässä, 7 päivää viikossa.

Miten Excitewinin pelialan valinta vastaa suomalaispelajien tarpeita?

Excitewin tarjoaa suomalaisille pelaajille monipuolisen pelialan, jossa on useita miellyttäviä valintoja. Kasinolla on suurta valikoima sloti-peleitä, jotka ovat erittäin suosittuja Suomessa. Myös live-kasino on käytettävissä, missä voi pelata käsinpelaajien kanssa. Excitewin myös sisältää erilaisia pelaamistapoja, kuten pelikoneet ja bingo, joten siellä on jotain kaikille. Lisäksi, Excitewin tarjoaa suomalaisille pelaajille erittäin hyvää asiakaspalvelua ja mahdollisuutta maksaa talletukset suosittuilla suomalaisilla maksuvalmentteilla.

Excitewinin bonukset ja edut

Tervetuloa Excitewin-casinoon, jossa saat runsas määrä bonus- ja etuaukoa!
Kerros ystävillesi kasinosta ja saat itsellesi suositusbonukset!
Excitewin tarjoaa myös monipuolisia peliä ja sivustolla on helppoa navigoida.
Lahjoita itsellesi ilmaiset pyöräytykset ja voita suuret voittot!
Excitewin-casinossa on myös lojaliteetisia ohjeita, jotka tuovat sinulle lisää etuja.
Käy tällä hetkellä Excitewin-casinossa ja aloita peliä suuren bonusmäärän kanssa!

Excitewin: Kaikkein paras kasino pelattavana verkossa Suomessa

Excitewinin asiakaspalvelu ja luotettisyys

Tervetuloa Excitewin-casinolle, jossa saat kokemukseksi suhtautumme asiakkaiden palveluun ja luotettisuuteen! Excitewin tarjoaa mukavan ja helposti käytettävän asiakaspalvelun, joka on käytettävissä 24/7. Pelikasinon luotettisuus on meidän prioriteettimme, joten voit olla varma siitä, että kaikki maksut ja pelit tapahtuvat turvallisesti ja riippumattomasti. Excitewin-casinolla on myös suuri valikoima peliä, joten sinulla on aina uusia mahdollisuuksia voittoihin. Lisäksi me tarjoamme monipuolisia maksuvalinnointimme ja perustamme suhteemme asiakkaiden kokemuksen ja tyytyväisyyden perusteelle. Valitse Excitewin-casinon, jossa asiakkaiden palvelu ja luotettisyys on ensi sijassa!

Miten Excitewinin mobiiliversio parantaa kokemusta?

Miten Excitewinin mobiiliversio parantaa kokemusta?
Excitewinin mobiiliversio on helpompi käyttää ja nopeampi.
Sivuston sisältö on selkeä ja käytännössä optimoidut mobiililaitteille.
Toiminnallisuus on täydellisesti säilytetty, mikä tekee pelin valinnan helppokäytöksiseksi.
Latausajat on lyhyet, joten ei tarvitse odottaa pitkiä aikoja ennen kuin aloitetaan peli.
Excitewinin mobiiliversio on kokonaisuudessaan parempi kokemus, joka tekee pelaamisen mukavamman ja hauskemman.

Review from a satisfied customer, Anni : “Excitewin on tosi hauska pelipaikka! Pelirakenteet on monipuolisia ja sisältö on aina kirjaudu sisään excitewin uusiintuvanlaatuinen. Pelinvoittamiseni olen voittanut jo useamman kerran, joten olen täysin tyytyväinen.”

Review from a happy customer, Jukka : “Excitewin on suosikkini! Pelialan varaamisesta saan nopeasti aloittaa ja pelit toimivat aina mielestäni erittäin kivaa. Olen suosinut erityisesti heidän valikoimansa video pellejä.”

Review from a content customer, Sanna : “Olen pelannut useita eri nettikasinoja, mutta Excitewin on varmasti yksi parhaista. Pelialusta on helppoa käyttää ja pelit toimivat aina kunnolla. Suosittelen!”

Review from a disappointed customer, Heikki : “Excitewinin pelialusta on hieman hankalaa käyttää ja pelien lataus voisi olla nopeampi. En ole vielä voittanut mitään, joten en ole tyytyväinen.”

Review from a frustrated customer, Marja : “Olen kokeillut monta eri peliä Excitewinillä, mutta en ole vielä löytänyt miellyttävää. Pelien käynnistys on hitaasti ja pelialusta on hieman hankalaa. En suosittele.”

Oletko kysymyksessäsi suosituimmasta kasinoverkossa Suomessa? Excitewin tarjoaa suomalaisille pelaajille erinomaisen kokemuksen pelien valinnasta ja mahdollisuuksista voittamaan. Jos et ole vielä kokeillut Excitewinia, on aika aloittaa tällä hetkellä!

Design and Develop by Ovatheme